package cn.iocoder.yudao.module.eval.service.assignment;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.eval.controller.admin.assignment.vo.*;
import cn.iocoder.yudao.module.eval.dal.dataobject.assignment.EvalPersonnelAssignmentDO;

import javax.validation.Valid;
import java.util.List;

/**
 * 人员分配 Service 接口
 *
 * @author 芋道源码
 */
public interface EvalAssignmentService {

    /**
     * 查询可用考评员
     *
     * @param professionCode 职业代码
     * @param skillLevels 技能等级
     * @param planId 计划ID
     * @return 可用考评员列表
     */
    List<EvalAvailableEvaluatorRespVO> getAvailableEvaluators(String professionCode, String skillLevels, Long planId);

    /**
     * 查询可用督导员
     *
     * @param planId 计划ID
     * @return 可用督导员列表
     */
    List<EvalAvailableSupervisorRespVO> getAvailableSupervisors(Long planId);

    /**
     * 分配考评员
     *
     * @param assignmentReqVO 分配信息
     */
    void assignEvaluators(@Valid EvalEvaluatorAssignmentReqVO assignmentReqVO);

    /**
     * 分配督导员
     *
     * @param assignmentReqVO 分配信息
     */
    void assignSupervisors(@Valid EvalSupervisorAssignmentReqVO assignmentReqVO);

    /**
     * 查询计划的人员分配
     *
     * @param planId 计划ID
     * @param personType 人员类型
     * @return 分配列表
     */
    List<EvalPersonnelAssignmentDO> getPlanAssignments(Long planId, Integer personType);

    /**
     * 分页查询人员分配
     *
     * @param pageReqVO 分页查询
     * @return 分配分页
     */
    PageResult<EvalPersonnelAssignmentDO> getAssignmentPage(EvalPersonnelAssignmentPageReqVO pageReqVO);

    /**
     * 确认任务分配
     *
     * @param assignmentId 分配ID
     * @param confirmStatus 确认状态
     * @param confirmComments 确认意见
     */
    void confirmAssignment(Long assignmentId, Integer confirmStatus, String confirmComments);

    /**
     * 替换人员
     *
     * @param assignmentId 分配ID
     * @param newUserId 新用户ID
     * @param reason 替换原因
     */
    void replacePersonnel(Long assignmentId, Long newUserId, String reason);

    /**
     * 取消人员分配
     *
     * @param assignmentId 分配ID
     * @param reason 取消原因
     */
    void cancelAssignment(Long assignmentId, String reason);

    /**
     * 查询考评员工作量
     *
     * @param userId 用户ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 工作量信息
     */
    EvalEvaluatorWorkloadRespVO getEvaluatorWorkload(Long userId, String startDate, String endDate);

    /**
     * 查询督导员工作安排
     *
     * @param userId 用户ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 工作安排列表
     */
    List<EvalSupervisorScheduleRespVO> getSupervisorSchedule(Long userId, String startDate, String endDate);

    /**
     * 人员分配统计
     *
     * @param planId 计划ID
     * @return 统计信息
     */
    EvalAssignmentStatisticsRespVO getAssignmentStatistics(Long planId);

    /**
     * 批量分配人员
     *
     * @param batchAssignReqVO 批量分配信息
     */
    void batchAssignPersonnel(@Valid EvalBatchAssignmentReqVO batchAssignReqVO);

    /**
     * 智能分配人员
     *
     * @param autoAssignReqVO 智能分配信息
     * @return 分配结果
     */
    EvalAutoAssignmentResultRespVO autoAssignPersonnel(@Valid EvalAutoAssignmentReqVO autoAssignReqVO);

    /**
     * 检查分配冲突
     *
     * @param planId 计划ID
     * @param userId 用户ID
     * @return 冲突列表
     */
    List<EvalAssignmentConflictRespVO> checkAssignmentConflicts(Long planId, Long userId);

    /**
     * 发送分配通知
     *
     * @param notificationReqVO 通知信息
     */
    void sendAssignmentNotification(@Valid EvalAssignmentNotificationReqVO notificationReqVO);

    /**
     * 我的分配任务
     *
     * @param status 任务状态
     * @return 任务列表
     */
    List<EvalPersonnelAssignmentDO> getMyAssignments(Integer status);

    /**
     * 接受分配任务
     *
     * @param assignmentId 分配ID
     * @param comments 意见
     */
    void acceptAssignment(Long assignmentId, String comments);

    /**
     * 拒绝分配任务
     *
     * @param assignmentId 分配ID
     * @param reason 拒绝原因
     */
    void rejectAssignment(Long assignmentId, String reason);

}
